#include "funciones.h"
#include "includes.h"

std::string intToStr(const int &numero, const int tamano)
{
    std::stringstream serializacionNumero;
    serializacionNumero << std::setw(tamano) << numero;
    std::string paddingConCeros = serializacionNumero.str();

    size_t primer = paddingConCeros.find_first_of(" ");
    size_t segundo = paddingConCeros.find_last_of(" ");
    if (primer != std::string::npos)
    {
        paddingConCeros.replace(primer, segundo + 1, segundo + 1 - primer, '0');
    }

    return paddingConCeros;
}

int strToInt(const std::string &numero)
{
	std::stringstream buffer(numero);
	int resultado;

	buffer >> resultado;

	return resultado;

}

void charToBits(unsigned char caracter, int *vector)
{
       int a = caracter;
       int i;
       for (i = 7; 0 <= i ; i--) {
               vector[i] = a % 2;
               a = a / 2;
       }
}


void agregarTamanoASerializacionComp(std::stringstream& stream,
									 const Toolkit::TipoSerializacion &tSerializacion)
{
        std::string contenido = stream.str();
        int tamano = stream.str().size();

        stream.str("");

        serializacionDigito(stream, tSerializacion, tamano);
        stream.write(contenido.c_str(), contenido.size());

}

unsigned int obtenerBit(const unsigned int &numero, const int &posicion)
{
	unsigned int resultadoMascara = numero & crearMascara(posicion);

	int cantidadShitfs = sizeof(unsigned int) * 8 - posicion - 1;

	unsigned int bitResultado = resultadoMascara >> cantidadShitfs;

	return bitResultado;
}

unsigned int crearMascara(const int &posicionUno)
{
	int mascara = 1;
	int cantidadShifts = sizeof(int) * 8 - posicionUno - 1;

	mascara = mascara << cantidadShifts;

	return mascara;
}

unsigned int obtenerBitReves(const unsigned char &numero, const int &posicion)
{
	return ( ( numero>>posicion ) &1 );
}
